﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using produccion.vistamodelo;
using System.ComponentModel;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FRMmancolo.xaml
    /// </summary>
    public partial class FRMmancolo : Window
    {
        mancolo _mancolo;

        DataTable DtConsulta;//FJRF - Para el manejo de las consultas genericas
        String StrConsulta;//FJRF - Para el manejo de la creacion de los string de consulta generica
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Para traer las funciones de mdo general

        private String StrBuscarConsecutivo()//FJRF - Para guscar el consecutivo que sigue
        {
            String StrDatoRetornado;//FJRF - Creamos una variable que retornara el dato

            DtConsulta = new DataTable();//FJRF - Establecemos una nueva instacia
            StrConsulta = "SELECT MAX(CODCOL_COL) + 1 AS CONSECUTIVO FROM MAECOLP";//FJRF - Buscamos el nuevo consecutivo creando la consulta sql
            DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Ejecutamos la consulta

            if (DtConsulta.Rows.Count > 0)//FJRF - Si existen datos hacemos lo siguiente
            {
                StrDatoRetornado = DtConsulta.Rows[0][0].ToString();//FJRF - Retornamos el valos encontrado
            }
            else//FJRF - Si no hay datos hacemos lo siguiente
            {
                StrDatoRetornado = "1";//FJRF - Retornamos uno
            }
            return StrDatoRetornado;//FJRF - Enviamos el dato encontrado
        }
        public FRMmancolo()
        {
            InitializeComponent();
            _mancolo = (mancolo)this.DataContext;
        }
   
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            _mancolo.listaColor();
            limpiar();
            texCod.Focus();
            texCod.Select(0,0);
            if (_mancolo.lisFilCol.Count > 0) {
                dataGrid1.SelectedIndex = 0;
            }

        }

        private void limpiar() {
            texCod.Text = "";
            texNom.Text = "";
            _mancolo.txtColor.CAMBIO = false;
        }

        string camb;
        private void texCod_TextChanged(object sender, TextChangedEventArgs e)
        {

            if (_mancolo.txtColor.CODCOL_COL != camb)
            {
                if (_mancolo.txtColor.CAMBIO)
                {
                    if (MessageBox.Show("¿Está seguro que desea cambiar de elemento? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)
                    {
                        _mancolo.txtColor.CODCOL_COL = camb;
                        return;
                    }
                    _mancolo.txtColor.CAMBIO = false;
                }
                camb = _mancolo.txtColor.CODCOL_COL;
                _mancolo.txtColor.consultar();
                if (!_mancolo.txtColor.EXISTE)
                {
                    texNom.Text = "";
                    _mancolo.txtColor.CAMBIO = false;
                }
            }
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (_mancolo.txtColor.CAMBIO)
            {
                if (MessageBox.Show("¿Está seguro que desea salir? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)
                {
                    e.Cancel = true;
                }
                else
                {
                    _mancolo.txtColor.CAMBIO = false;
                }
            }
        }

        private void butNue_Click(object sender, RoutedEventArgs e)
        {
            if (_mancolo.txtColor.CAMBIO)
            {
                if (MessageBox.Show("¿Está seguro que desea crear un nuevo elemento? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)
                {
                    return;
                }
                _mancolo.txtColor.CAMBIO = false;
            }
            limpiar();

            String StrNuevoConsecutivo = StrBuscarConsecutivo();//FJRF - Buscamos el siguiente consecutivo
            texCod.Text = StrNuevoConsecutivo;//FJRF - Asignamos el consecutivo

            texNom.Focus();
            _mancolo.GACTIVO = true;
            
        }

        private void butSal_Click(object sender, RoutedEventArgs e)
        {
              this.Close();
        }
        
        private void butEli_Click(object sender, RoutedEventArgs e)
        {
            if (MessageBox.Show("¿Esta seguro que desea eliminar el elemento?", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel) {
                return;
            }
            _mancolo.eliminar(wPnot);
            limpiar();
        }

        private void butGua_Click(object sender, RoutedEventArgs e)
        {
            if (StrValidarSiSePuedeGuardar() == "SI")
            {
                _mancolo.guardar(wPnot);
                Msgbox("PROCESO EXITOSO", "Información guardada con exito", MessageBoxButton.OK, MessageBoxImage.Exclamation);
            }
            else
            {
                Msgbox("PROCESO CANCELADO", StrValidarSiSePuedeGuardar(), MessageBoxButton.OK, MessageBoxImage.Error);
            }
            
        }
        #region FJRF - MsgboxPersonalizado
        protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
        {
            MessageBoxButton buttons;
            buttons = MsbTipoBoton;

            MessageBoxImage icon = MsbTipoImagenIcono;
            MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
        }
        #endregion

        private String StrValidarSiSePuedeGuardar()
        {
            String StrSePuedeGuardar = "SI";

            if (texCod.Text.Trim() == "")//FJRF - Si no hay datos digitados hacemos lo siguiente
            {
                StrSePuedeGuardar = "No ha digitado ningun codigo, recuerde que el codigo debe ser de 4 digitos";
                texCod.Focus();//FJRF - Enviamos el foco donde esta el error
            }
            if (texCod.Text.Length < 4)//FJRF - Si el codigo es menor a cuatro hacemos lo siguiente
            {
                StrSePuedeGuardar = "El código debe ser de 4 digitos";
                texCod.Focus();//FJRF - Enviamos el foco donde esta el error
            }
            if (texNom.Text.Trim() == "")//FJRF - Si no ha digitado el nombre hacemos lo siguiente
            {
                StrSePuedeGuardar = "Falta digitar el nombre del color";
                texCod.Focus();//FJRF - Enviamos el foco donde esta el error
            }
            return StrSePuedeGuardar;
        }
        private void cm_Closed(object sender, RoutedEventArgs e)
        {
            _mancolo.filtrar();
        }

        private void quiFil_Click(object sender, RoutedEventArgs e)
        {
            _mancolo.quiFil();
        }

        private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {   
            if (_mancolo.txtColor.CAMBIO)
                {
                    if (MessageBox.Show("¿Está seguro que desea cambiar de elemento? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)//RRR
                    {
                        return;
                    }
                    _mancolo.txtColor.CAMBIO = false;
                }
            
                if (_mancolo.selColor != null)
                {
                    _mancolo.txtColor.CODCOL_COL= _mancolo.selColor.CODCOL_COL;
                    _mancolo.txtColor.EXISTE = true;
                }
           
        }

        private void bGenerar(object sender, RoutedEventArgs e)
        {
            String StrNuevoConsecutivo = StrBuscarConsecutivo();//FJRF - Buscamos el nuevo consecutivo
            texCod.Text = StrNuevoConsecutivo;//FJRF - Asignamos el nuevo consecutivo
            texNom.Focus();//FJRF - Ponemos el foco en el nombre

            //List<clases.CLSMAECOLP> lcolor = _mancolo.lisColor;
            
            //string codigo = "";
            //char c = 'a';
            //while (c <= 'z')
            //{
            //    for (int i = 0; i <= 9; i++)
            //    {

            //        if (lcolor.Find(r => r.CODCOL_COL.Equals(c.ToString() + i.ToString())) == null)
            //        {
            //            codigo = c.ToString() + i.ToString();
            //            break;
            //        }
            //        if (lcolor.Find(r => r.CODCOL_COL.Equals(c.ToString().ToUpper() + i.ToString())) == null)
            //        {
            //            codigo = c.ToString().ToUpper() + i.ToString();
            //            break;
            //        }

            //        if (lcolor.Find(r => r.CODCOL_COL.Equals(i.ToString() + c.ToString())) == null)
            //        {
            //            codigo = i.ToString() + c.ToString();
            //            break;
            //        }
            //        if (lcolor.Find(r => r.CODCOL_COL.Equals(i.ToString() + c.ToString().ToUpper())) == null)
            //        {
            //            codigo = i.ToString() + c.ToString().ToUpper();
            //            break;
            //        }
            //    }
            //    if (!codigo.Equals(""))
            //    {
            //        break;
            //    }
            //    c++;
            //}

            //if (codigo.Equals(""))
            //{
            //    new MDOgeneral.notificar(wPnot, "No se puede encontrar combinacion de letras y numeros disponibles para el codigo.", false);
            //}
            //else
            //{
            //    _mancolo.txtColor.CODCOL_COL = codigo;
         
            //}

            //_mancolo.GACTIVO = false;
        }

        private void dataGrid1_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        //private void butBusCol_Click(object sender, RoutedEventArgs e)
        //{
        //    _mancolo.buscarColor();
        //}

        //
        // SINGLE CLICK EDITING
        //
        private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DataGridCell cell = sender as DataGridCell;
            if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
            {
                if (!cell.IsFocused)
                {
                    cell.Focus();
                }
                DataGrid dataGrid = FindVisualParent<DataGrid>(cell);
                if (dataGrid != null)
                {
                    if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
                    {
                        if (!cell.IsSelected)
                            cell.IsSelected = true;
                    }
                    else
                    {
                        DataGridRow row = FindVisualParent<DataGridRow>(cell);
                        if (row != null && !row.IsSelected)
                        {
                            row.IsSelected = true;
                        }
                    }
                }
            }
        }

        static T FindVisualParent<T>(UIElement element) where T : UIElement
        {
            UIElement parent = element;
            while (parent != null)
            {
                T correctlyTyped = parent as T;
                if (correctlyTyped != null)
                {
                    return correctlyTyped;
                }

                parent = VisualTreeHelper.GetParent(parent) as UIElement;
            }
            return null;
        }

        private void texCod_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            //FJRF - VALIDAMOS QUE SOLO SE ACEPTEN NUMEROS
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if (ascci >= 48 && ascci <= 57) e.Handled = false;
            else e.Handled = true;
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        } 


    }

    internal class mancolo:ObservableObject {

        #region propiedades

        //----------------------------------
        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; RaisePropertyChangedEvent("strTituloVentana"); }
        }

        private VMbuscarGeneral _buscarColor;
        public VMbuscarGeneral buscarColor
        {
            get { return _buscarColor; }
            set { _buscarColor = value; RaisePropertyChangedEvent("buscarColor"); }
        }

        private clases.CLSMAECOLP _txtColor = new clases.CLSMAECOLP();
        public clases.CLSMAECOLP txtColor {
            get { return _txtColor; } 
            set { _txtColor = value;
            RaisePropertyChangedEvent("txtColor");
            }
        }

        private clases.CLSMAECOLP _filColor = new clases.CLSMAECOLP {CODCOL_COL="",NOMCOL_COL=""};
        public clases.CLSMAECOLP filColor
        {
            get { return _filColor; }
            set
            {
                _filColor = value;
                RaisePropertyChangedEvent("filColor");
            }
        }

        private clases.CLSMAECOLP _selColor = new clases.CLSMAECOLP();
        public clases.CLSMAECOLP selColor
        {
            get { return _selColor; }
            set
            {
                _selColor = value;
                RaisePropertyChangedEvent("selColor");
             
            }
        }

        private List<clases.CLSMAECOLP> _lisColor = new List<clases.CLSMAECOLP>();
        public List<clases.CLSMAECOLP> lisColor
        {
            get { return _lisColor; }
            set
            {
                _lisColor = value;
                RaisePropertyChangedEvent("lisColor");
            }
        }

        private List<clases.CLSMAECOLP> _lisFilCol = new List<clases.CLSMAECOLP>();
        public List<clases.CLSMAECOLP> lisFilCol
        {
            get { return _lisFilCol; }
            set
            {
                _lisFilCol = value;
                RaisePropertyChangedEvent("lisFilCol");
            }
        }

        #endregion

        #region metodos

        //--------------------------------------------------------------

        public mancolo()
        {
            cargarColores();

            MDOgeneral.conectar();
            strTituloVentana = "Mantenimiento de colores - Usuario: " + MDOgeneral.usuario + " - [FRMmancolo]";
        }

        private void cargarColores()
        {
            try
            {
                List<clases.CLSMAECOLP> liscolores = new clases.CLSMAECOLP().listaColor();
                _buscarColor = new VMbuscarGeneral((from col in liscolores select new 
                    VMlistaGenerica { strColumna1 = col.CODCOL_COL, strColumna2 = col.NOMCOL_COL }).ToList());
                buscarColor.PropertyChanged += onBuscarColorPropertyChanged;
                buscarColor.gridBuscar.columna1.strNombre = "Código";
                buscarColor.gridBuscar.columna2.strNombre = "Nombre color     ";
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void onBuscarColorPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            try
            {
                if (e.PropertyName == "IsOpen")
                {
                    if (!buscarColor.IsOpen)
                    {
                        if (buscarColor.gridBuscar.selLista != null)
                        {
                            txtColor.CODCOL_COL = buscarColor.gridBuscar.selLista.strColumna1;
                        }
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        RelayCommand _cmdBuscarColor;
        public ICommand cmdBuscarColor
        {
            get
            {
                if (_cmdBuscarColor == null)
                {
                    _cmdBuscarColor = new RelayCommand(r => buscar_color());
                }
                return _cmdBuscarColor;
            }
       }

        private void buscar_color()
        {
            try
            {
                buscarColor.IsOpen = true;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
            

        public void listaColor()
        {
            try
            {
                lisColor = selColor.listaColor();
                lisFilCol = lisColor;
            }
            catch (Exception ex) {MessageBox.Show(ex.Message);}
        }
        
        public void guardar(WrapPanel wPnot)
        {
            try
            {

                if (txtColor.EXISTE)
                {
                    if (txtColor.actualizar() > 0)
                    {
                        txtColor.CAMBIO = false;
                        lisColor.Clear();
                        lisColor = txtColor.listaColor();
                        filtrar();
                        new MDOgeneral.notificar(wPnot, "Los cambios fueron guardados satisfactoriamente.", true);
                    }
                    else
                    {
                        new MDOgeneral.notificar(wPnot, "Los cambios no pueden ser guardados.", false);
                    }
                }
                else
                {
                    if (txtColor.insertar() > 0)
                    {
                        txtColor.CAMBIO = false;
                        txtColor.EXISTE = true;
                        lisColor.Clear();
                        lisColor = txtColor.listaColor();
                        filtrar();                       
                        new MDOgeneral.notificar(wPnot, "El elemento fue creado satisfactoriamente.", true);
                    }
                    else
                    {
                        new MDOgeneral.notificar(wPnot, "El elemento no puede ser creado.", false);
                    }
                }

            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        
        public void eliminar(WrapPanel wPnot)
        {
            try
            {
                if (txtColor.eliminar() > 0)
                {
                    txtColor.CAMBIO = false;
                    lisColor.Clear();
                    lisColor = txtColor.listaColor();
                    filtrar();
                    new MDOgeneral.notificar(wPnot, "El elemento ha sido eliminado satisfactoriamente.", true);
                }
                else
                {
                    new MDOgeneral.notificar(wPnot, "El elemento no puede ser eliminado.", false);
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }     
        }

        public void filtrar() {
            lisFilCol = lisColor.FindAll(r => r.NOMCOL_COL.ToUpper().Contains(filColor.NOMCOL_COL.ToUpper()) & r.CODCOL_COL.Contains(filColor.CODCOL_COL));
            lisFilCol.Add(new clases.CLSMAECOLP { NOMCOL_COL = "", CODCOL_COL = ""});
        }

        public void quiFil()
        {
            filColor = new clases.CLSMAECOLP { NOMCOL_COL = "", CODCOL_COL = ""};
            lisFilCol = lisColor.FindAll(r => r.NOMCOL_COL.ToUpper().Contains(filColor.NOMCOL_COL.ToUpper()) & r.CODCOL_COL.Contains(filColor.CODCOL_COL));
        }
        
        #endregion

        //public void buscarColor() {
        //    try {
        //        clases.CLSMAECOLP datos = new clases.CLSMAECOLP();
        //        FRMbuscar frm = new FRMbuscar(datos, "buscar", "Nombre_color", "NOMCOL_COL", "Codigo_color");
        //        frm.ShowDialog();
        //        txtColor.CODCOL_COL = frm.retorno;
        //    }
        //    catch (Exception ex) { MessageBox.Show(ex.Message); }
        //}

        private Boolean _GACTIVO = false;
        public Boolean GACTIVO {
            get { return _GACTIVO; }
            set { _GACTIVO = value;
            RaisePropertyChangedEvent("GACTIVO");
            }
        }

    }
}
